package br.com.site;

import java.util.ArrayList;
import java.util.List;

import model.Equipamento;
import model.Equipe;
import model.PDI;
import model.Veiculo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TableLayout;
import android.widget.TextView;

import com.google.android.maps.GeoPoint;

public class NovoEquipamento extends Activity{

	private List<Veiculo> listaVeiculos;
	private List<Equipe> listaEquipes;
	
	private TableLayout tlEquipDelete;
	
	private EditText etEquipIdentificacao, etEquipTipoDeEquipamento, etEquipDisponiveis, etEquipQuantidade;
	private Spinner spEquipTeam, spEquipVeiculo;
	private ImageButton salvar;
	private TextView tvTit;
	
	private ArrayAdapter<CharSequence> adtEquipTeam, adtEquipVeiculo;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.novo_equipamento);
		
		carregaViews();
		
		tlEquipDelete.setVisibility(View.GONE);
		
		setPDIArrayAdapter(adtEquipTeam, spEquipTeam, listaEquipes);
		setPDIArrayAdapter(adtEquipVeiculo, spEquipVeiculo, listaVeiculos);
        
		if(!Global.editarPDI) novoPDI();
        else editarPDI();
	}
	
	private void novoPDI() {
		salvar.setOnClickListener(new OnClickListener() {		
			@Override
			public void onClick(View arg0) {
				salvar.setImageResource(R.drawable.bt_aplicar);
				GeoPoint temp = new GeoPoint(0, 0);
				String identif = etEquipIdentificacao.getText().toString();
				String tipoEquip = etEquipTipoDeEquipamento.getText().toString();
				
				String textoBalao = tipoEquip;
				
				int qtd = 0;
				try{
					 qtd = Integer.parseInt(etEquipQuantidade.getText().toString());
				}catch(NumberFormatException nfe){
					qtd = -1;
				}
				
				int disp = 0;
				try{
					 disp = Integer.parseInt(etEquipDisponiveis.getText().toString());
					 if (qtd != -1) textoBalao += ", " + disp + " disponíveis em " + qtd;
					 if (qtd == 1) textoBalao = tipoEquip + ", " + disp + " disponível em " + qtd;
				}catch(NumberFormatException nfe){
					disp = -1;
				}
				
				
				Equipe team = null;
				for (Equipe e : listaEquipes) {
					if (spEquipTeam.getSelectedItem().equals(e.toString())){
						team = e;
					}else{
						continue;
					}
				}
				
				Veiculo vei = null;
				for (Veiculo v : listaVeiculos) {
					if (spEquipVeiculo.getSelectedItem().equals(v.toString())){
						vei = v;
					}else{
						continue;
					}
				}
				
				if (vei != null) textoBalao += "\nVeículo: " + vei.toString();
				if (team != null) textoBalao += "\nEquipe: " + team.toString();
				
				
				Equipamento eqp = new Equipamento(temp,
						identif, textoBalao, vei, team, identif, tipoEquip, qtd, disp);
				
				if(vei != null) vei.setEquipamento(eqp);
				if(team != null) team.setEquipamento(eqp);
								
				br.com.site.MainActivity.objetoPassado = eqp;
				Global.novoPdi = true;
				finish();
				br.com.site.MainActivity.exibeToast(getApplicationContext(), "Toque na tela para posicionar o equipamento.");
				
			}
		});		
	}
	
	private void editarPDI() {
		salvar.setImageResource(R.drawable.bt_edit);
    	tvTit.setText("Editar Equipamento");
    	tlEquipDelete.setVisibility(View.VISIBLE);
    	
    	final TextView tvDel = (TextView) findViewById(R.novo_equipamento.tvDelEquip);
    	final ImageView ivDel = (ImageView) findViewById(R.novo_equipamento.ivDelEquip);
    	
    	final Equipamento e = (Equipamento) Global.pdiEdicao;
    	
    	tvDel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				deletaObj(e);
			}
		});
    	
    	ivDel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				deletaObj(e);
			}
		});

    	etEquipIdentificacao.setText(e.getIdentificacao());
    	etEquipTipoDeEquipamento.setText(e.getTipoDeEquipamento());
    	etEquipQuantidade.setText(String.valueOf(e.getQuantidade()));
    	etEquipDisponiveis.setText(String.valueOf(e.getDisponiveis()));
    	
    	try{
    		setAdapterPositionFromString(spEquipVeiculo,e.getVeiculo().toString());
    	}catch (NullPointerException ex) {
    		setAdapterPositionFromString(spEquipVeiculo, "Desconhecido");
		}try{
    		setAdapterPositionFromString(spEquipTeam,e.getEquipe().toString());
    	}catch (NullPointerException ex) {
    		setAdapterPositionFromString(spEquipTeam, "Desconhecido");
		}
    	
    	salvar.setOnClickListener(new OnClickListener() {		
			@Override
			public void onClick(View arg0) {
				MainActivity.listaEquipamentos.remove(e);
				
				e.setIdentificacao(setStringEditText(etEquipIdentificacao));
				e.setTipoDeEquipamento(setStringEditText(etEquipTipoDeEquipamento));
				
				String textoBalao = etEquipTipoDeEquipamento.getText().toString();
				
				int qtd = -1;
				try{
					qtd = Integer.parseInt(etEquipQuantidade.getText().toString());
				}catch(NumberFormatException exc){}
				
				e.setQuantidade(qtd);
				
				try{
					int disp = Integer.parseInt(etEquipDisponiveis.getText().toString());
					e.setDisponiveis(disp);
					if (qtd > 1) textoBalao += ", " + disp + " disponíveis em " + qtd;
					 	if (qtd == 1) textoBalao += ", " + disp + " disponível em " + qtd;
				}catch(NumberFormatException exc){
					e.setDisponiveis(-1);
				}
				
				
				
				
				Equipe team = null;
				for (Equipe e : listaEquipes) {
					if (spEquipTeam.getSelectedItem().equals(e.toString())){
						team = e;
					}else{
						continue;
					}
				}
				
				Veiculo vei = null;
				for (Veiculo v : listaVeiculos) {
					if (spEquipVeiculo.getSelectedItem().equals(v.toString())){
						vei = v;
					}else{
						continue;
					}
				}
				
				if (vei != null) textoBalao += "\nVeículo: " + vei.toString();
				if (team != null) textoBalao += "\nEquipe: " + team.toString();
				
				
				if(vei != null) e.setVeiculo(vei);
				if(team != null) e.setEquipe(team);
				e.setTextoBalao(textoBalao);
				
				try{
					vei.setEquipamento(e);
				}catch(NullPointerException exc){
					//TODO o que fazer se o user cadastra um equipamento e descadastra?
				}
				try{
					team.setEquipamento(e);
				}catch(NullPointerException exc){
					//TODO o que fazer se o user cadastra um equipamento e descadastra?
				}
				
				atualizaObj(e);
            	finish();
    			Global.editarPDI=false;
    			MainActivity.exibeToast(getApplicationContext(), "Dados atualizados");
			}
		});
	}

	private void carregaViews() {
		listaVeiculos = br.com.site.MainActivity.listaVeiculos;
		listaEquipes = br.com.site.MainActivity.listaEquipes;
		
		tlEquipDelete = (TableLayout) findViewById(R.novo_equipamento.tlEquipDelete);
		
		etEquipIdentificacao = (EditText) findViewById(R.novo_equipamento.etEquipIdentificacao);
		etEquipTipoDeEquipamento = (EditText) findViewById(R.novo_equipamento.etEquipTipoDeEquipamento);
		etEquipDisponiveis = (EditText) findViewById(R.novo_equipamento.etEquipDisponiveis);
		etEquipQuantidade = (EditText) findViewById(R.novo_equipamento.etEquipQuantidade);
    	
    	spEquipTeam = (Spinner) findViewById(R.novo_equipamento.spEquipTeam);
    	spEquipVeiculo = (Spinner) findViewById(R.novo_equipamento.spEquipVeiculo);
    	
    	adtEquipTeam = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
    	adtEquipTeam.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    	adtEquipVeiculo = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
        adtEquipVeiculo.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
        salvar = (ImageButton) findViewById(R.novo_equipamento.equipSalvar);
        
        tvTit = (TextView) findViewById(R.novo_equipamento.tvEquipTit);
	}
	
	/**
	 * Este método aplicará a um spinner um ArrayAdapter populado pelos toStrings de cada PDI contido numa lista de PDIs
	 * @param aAdapter ArrayAdapter que será aplicado no Spinner
	 * @param sp Spinner que receberá os toStrings dos PDIs
	 * @param l Lista de PDIs a serem adicionados ao ArrayAdapter
	 */
	private void setPDIArrayAdapter(ArrayAdapter<CharSequence> aAdapter, Spinner sp, List<?> l){
		aAdapter = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
		aAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
		sp.setAdapter(aAdapter);
        if(l.size() < 1){
        	aAdapter.add("Desconhecido");
        }else{
        	aAdapter.add("Desconhecido");
	        for (int j = 0; j < l.size(); j++) {
	        	aAdapter.add(l.get(j).toString());
			}
    	}
	}

	public void setAdapterPositionFromString(Spinner spinner, String texto){
		@SuppressWarnings({ "unchecked", "rawtypes" })
		ArrayAdapter<CharSequence> adapter = (ArrayAdapter) spinner.getAdapter();
		try{
			int pos = adapter.getPosition(texto);
			spinner.setSelection(pos);
		}catch(NullPointerException exc){
			spinner.setSelection(0);
		}
	}
	
	public static void atualizaObj(Equipamento e){
		MainActivity.equipamentoOverlays.clear();
		for (Equipamento eqp : MainActivity.listaEquipamentos) {
			if(!eqp.equals(e)){
				MainActivity.equipamentoOverlays.addOverlay(eqp.getOverlayItem(), eqp);
			}
		}
		MainActivity.equipamentoOverlays.addOverlay(e.getOverlayItem(), e);
		MainActivity.listaEquipamentos.add(e);
		MainActivity.equipamentoOverlays.hideBalloon();
		
	}
	
	public void deletaObj(final Equipamento e){
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Excluir Equipamento")
			   .setMessage("Tem certeza?")
		       .setCancelable(false)
		       .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		        	   ArrayList<PDI> links = Global.getArrayDeLinks(e);
		        	   if(!links.equals(null) && links.size()>0){
		        		   for (PDI pdi : links) {
		        			   if(pdi instanceof Veiculo){
		        				   Veiculo v = (Veiculo) pdi;
		        				   v.setEquipamento(null);
		        				   v.atualizaTextoBalao();
		        				   NovoVeiculo.atualizaObj(v);
		        			   }
		        			   if(pdi instanceof Equipe){
		        				   Equipe es = (Equipe) pdi;
		        				   es.setEquipamento(null);
		        				   es.atualizaTextoBalao();
		        				   NovoEquipe.atualizaObj(es);
		        			   }
		        		   }
		        	   }
		        	   
		        	   MainActivity.equipamentoOverlays.clear();
		        	   
		        	   MainActivity.listaEquipamentos.remove(e);
		        	   for (Equipamento eqp : MainActivity.listaEquipamentos) {
		        		   MainActivity.equipamentoOverlays.addOverlay(eqp.getOverlayItem(), eqp);
		        	   }
		        	   MainActivity.equipamentoOverlays.hideBalloon();
		        	   finish();
		        	   Global.editarPDI=false;
		           }
		       })
		       .setNegativeButton("Não", new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		                dialog.cancel();
		           }
		       });
		builder.show();
	}
	
	public String setStringEditText(EditText et){
		if (et.getText().toString().equals("")){
			return "Desconhecido";
		}
		return et.getText().toString();
	}

	@Override
	public void onBackPressed() {
		Global.editarPDI=false;
		super.onBackPressed();
	}
}
